κΈλ‘λ² λμμ μν κ°λ ₯νκ³ νμ₯ κ°λ₯νλ©° μ μ§ λ³΄μκ° μ©μ΄ν μ΄λ²€νΈ-κΈ°λ° μν€ν μ²(EDA) ꡬμΆμμ νμ -μΈμ΄ν λ©μμ§ νμ μ€μν μν μ νμν©λλ€. λ€μν EDA ν¨ν΄κ³Ό νμ μμ μ±μ΄ μμ μ±μ ν₯μμν€λ λ°©λ²μ μ΄ν΄νμΈμ.
νμ -μΈμ΄ν λ©μμ§ ν: νλ μ΄λ²€νΈ-κΈ°λ° μν€ν μ²μ μ΄μ
μ€λλ λΉ λ₯΄κ² μ§ννλ λμ§νΈ νκ²½μμ νλ ₯μ μ΄κ³ νμ₯ κ°λ₯νλ©° μ μ κ°λ₯ν μννΈμ¨μ΄ μμ€ν μ ꡬμΆνλ κ²μ΄ κ°μ₯ μ€μν©λλ€. μ΄λ²€νΈ-κΈ°λ° μν€ν μ²(EDA)λ μ΄λ¬ν λͺ©νλ₯Ό λ¬μ±νκΈ° μν μ§λ°°μ μΈ ν¨λ¬λ€μμΌλ‘ λΆμνμ¬ μμ€ν μ΄ μ€μκ°μΌλ‘ μ΄λ²€νΈμ λ°μν μ μλλ‘ ν©λλ€. λͺ¨λ κ°λ ₯ν EDAμ ν΅μ¬μλ λ©μμ§ νκ° μμΌλ©°, μ΄λ λ€μν μλΉμ€ κ°μ λΉλκΈ° ν΅μ μ μ©μ΄νκ² νλ μ€μν κ΅¬μ± μμμ λλ€. κ·Έλ¬λ μμ€ν μ 볡μ‘μ±μ΄ μ¦κ°ν¨μ λ°λΌ μ€μν κ³Όμ κ° λ°μν©λλ€. λ°λ‘ κ΅νλλ λ©μμ§μ 무결μ±κ³Ό μμΈ‘ κ°λ₯μ±μ 보μ₯νλ κ²μ λλ€. μ¬κΈ°μ νμ -μΈμ΄ν λ©μμ§ νκ° λ±μ₯νμ¬ λΆμ° μμ€ν μμ μ μ§λ³΄μμ±, μμ μ± λ° κ°λ°μ μμ°μ±μ μ μ§νκΈ° μν κ°λ ₯ν μ루μ μ μ 곡ν©λλ€.
μ΄ ν¬κ΄μ μΈ κ°μ΄λλ νμ -μΈμ΄ν λ©μμ§ νμ μΈκ³μ νλ μ΄λ²€νΈ-κΈ°λ° μν€ν μ²μμ κ·Έ μ€μν μν μ μμΈν μ΄ν΄λ΄ λλ€. EDAμ κΈ°λ³Έ κ°λ μ νꡬνκ³ , λ€μν μν€ν μ² ν¨ν΄μ κ²ν νλ©°, νμ μμ μ±μ΄ λ©μμ§ νλ₯Ό λ¨μν λ°μ΄ν° νμ΄νλΌμΈμμ μ λ’°ν μ μλ ν΅μ μ±λλ‘ μ΄λ»κ² λ³ννλμ§ κ°μ‘°ν©λλ€.
μ΄λ²€νΈ-κΈ°λ° μν€ν μ² (EDA) μ΄ν΄
νμ μμ μ±μ λν΄ μμΈν μμ보기 μ μ μ΄λ²€νΈ-κΈ°λ° μν€ν μ²μ ν΅μ¬ μ리λ₯Ό νμ νλ κ²μ΄ μ€μν©λλ€. EDAλ μ 보 νλ¦μ΄ μ΄λ²€νΈμ μν΄ μ£Όλλλ μννΈμ¨μ΄ λμμΈ ν¨ν΄μ λλ€. μ΄λ²€νΈλ μμ€ν λ΄μμ λ°μνλ μ€μν μ¬κ±΄ λλ μν λ³κ²½μΌλ‘, μμ€ν μ λ€λ₯Έ λΆλΆμ΄ κ΄μ¬μ κ°μ§ μ μμ΅λλ€. μλΉμ€ κ°μ μ§μ μ μΈ λκΈ° μμ² λμ EDAλ μ΄λ²€νΈλ₯Ό λ΄λ³΄λ΄λ νλ‘λμμ μ΄μ λ°μνλ 컨μλ¨Έμ μμ‘΄ν©λλ€. μ΄λ¬ν λΆλ¦¬λ λ€μκ³Ό κ°μ μ¬λ¬ κ°μ§ μ΄μ μ μ 곡ν©λλ€.
- λΆλ¦¬: μλΉμ€λ μλ‘μ μ‘΄μ¬ λλ ꡬν μΈλΆ μ¬νμ λν μ§μ μ μΈ μ§μμ΄ νμνμ§ μμ΅λλ€. μμ±νκ±°λ μλΉνλ μ΄λ²€νΈλ₯Ό μ΄ν΄νκΈ°λ§ νλ©΄ λ©λλ€.
- νμ₯μ±: κ°λ³ μλΉμ€λ νΉμ λΆνμ λ°λΌ λ 립μ μΌλ‘ νμ₯ν μ μμ΅λλ€.
- νλ ₯μ±: νλμ μλΉμ€λ₯Ό μΌμμ μΌλ‘ μ¬μ©ν μ μλ κ²½μ° λ€λ₯Έ μλΉμ€λ λμ€μ λλ μ¬μλλ₯Ό ν΅ν΄ μ΄λ²€νΈλ₯Ό μ²λ¦¬νμ¬ κ³μ μλν μ μμ΅λλ€.
- μ€μκ° μλ΅μ±: μμ€ν μ λ³κ²½ μ¬νμ μ¦μ λ°μνμ¬ λΌμ΄λΈ λμ보λ, μ¬κΈ° νμ§ λ° IoT λ°μ΄ν° μ²λ¦¬μ κ°μ κΈ°λ₯μ νμ±νν μ μμ΅λλ€.
λ©μμ§ ν(λ©μμ§ λΈλ‘컀 λλ λ©μμ§ μ§ν₯ λ―Έλ€μ¨μ΄λΌκ³ λ ν¨)λ EDAμ μ€μΆμ λλ€. λ©μμ§ νλ μ€κ°μ μν μ νμ¬ λ©μμ§λ₯Ό μμλ‘ μ μ₯νκ³ κ΄μ¬ μλ μλΉμμκ² μ λ¬ν©λλ€. μΈκΈ° μλ μλ‘λ Apache Kafka, RabbitMQ, Amazon SQS λ° Google Cloud Pub/Subμ΄ μμ΅λλ€.
κ³Όμ : λ©μμ§ μ€ν€λ§ λ° λ°μ΄ν° 무결μ±
λΆμ° μμ€ν , νΉν EDAλ₯Ό μ¬μ©νλ μμ€ν μμλ μ¬λ¬ μλΉμ€κ° λ©μμ§λ₯Ό μμ±νκ³ μλΉν©λλ€. μ΄λ¬ν λ©μμ§λ μ’ μ’ λΉμ¦λμ€ μ΄λ²€νΈ, μν λ³κ²½ λλ λ°μ΄ν° λ³νμ λνλ λλ€. λ©μμ§ νμμ λν ꡬ쑰νλ μ κ·Ό λ°©μμ΄ μμΌλ©΄ μ¬λ¬ λ¬Έμ κ° λ°μν μ μμ΅λλ€.
- μ€ν€λ§ μ§ν: μ ν리μΌμ΄μ μ΄ μ§νν¨μ λ°λΌ λ©μμ§ κ΅¬μ‘°(μ€ν€λ§)λ νμ°μ μΌλ‘ λ³κ²½λ©λλ€. μ λλ‘ κ΄λ¦¬νμ§ μμΌλ©΄ νλ‘λμκ° μ»¨μλ¨Έκ° μ΄ν΄νμ§ λͺ»νλ μ νμμΌλ‘ λ©μμ§λ₯Ό 보λ΄κ±°λ κ·Έ λ°λμ κ²½μ°κ° λ°μν μ μμ΅λλ€. μ΄λ‘ μΈν΄ λ°μ΄ν° μμ, λ©μμ§ μμ λ° μμ€ν μ€λ₯κ° λ°μν μ μμ΅λλ€.
- λ°μ΄ν° μ ν λΆμΌμΉ: νλ‘λμκ° νλμ μ μ κ°μ 보λ΄λ λ°λ©΄ 컨μλ¨Έλ λ¬Έμμ΄μ μμνκ±°λ κ·Έ λ°λμ κ²½μ°κ° λ°μν μ μμ΅λλ€. μ΄λ¬ν λ―Έλ¬ν μ ν λΆμΌμΉλ λΆμ° νκ²½μμ λλ²κΉ νκΈ° μ΄λ €μ΄ λ°νμ μ€λ₯λ₯Ό μΌμΌν¬ μ μμ΅λλ€.
- λͺ¨νΈμ± λ° μ€ν΄: μμλλ λ°μ΄ν° μ ν λ° κ΅¬μ‘°μ λν λͺ νν μ μκ° μμΌλ©΄ κ°λ°μλ λ©μμ§ νλμ μλ―Έ λλ νμμ μλͺ» ν΄μνμ¬ μ»¨μλ¨Έμμ μλͺ»λ λ Όλ¦¬κ° λ°μν μ μμ΅λλ€.
- ν΅ν© μ§μ₯: μλ‘μ΄ μλΉμ€λ₯Ό ν΅ν©νκ±°λ κΈ°μ‘΄ μλΉμ€λ₯Ό μ λ°μ΄νΈνλ κ²μ λ©μμ§ νμμ μλμΌλ‘ νμΈνκ³ νΈνμ± λ¬Έμ λ₯Ό μ²λ¦¬νλ κ³ ν΅μ€λ¬μ΄ νλ‘μΈμ€κ° λ©λλ€.
μ΄λ¬ν κ³Όμ λ λ©μμ§ κ΅νμμ μΌκ΄μ±κ³Ό μμΈ‘ κ°λ₯μ±μ 보μ₯νλ λ©μ»€λμ¦, μ¦ λ©μμ§ νμ μ ν μμ μ±μ λ³Έμ§μ λν νμμ±μ κ°μ‘°ν©λλ€.
νμ -μΈμ΄ν λ©μμ§ νλ 무μμ λκΉ?
EDAμ λ§₯λ½μμ νμ -μΈμ΄ν λ©μμ§ νλ λ©μμ§μ ꡬ쑰μ λ°μ΄ν° μ νμ΄ κ³΅μμ μΌλ‘ μ μλκ³ μ μ©λλ μμ€ν μ μλ―Έν©λλ€. μ¦, νλ‘λμκ° λ©μμ§λ₯Ό λ³΄λΌ λ 미리 μ μλ μ€ν€λ§λ₯Ό μ€μν΄μΌ νλ©°, 컨μλ¨Έκ° λ©μμ§λ₯Ό μμ ν λ μμλλ ꡬ쑰μ μ νμ κ°λλ‘ λ³΄μ₯λ©λλ€. μ΄λ μΌλ°μ μΌλ‘ λ€μμ ν΅ν΄ λ¬μ±λ©λλ€.
- μ€ν€λ§ μ μ: νλ μ΄λ¦, λ°μ΄ν° μ ν(μ: λ¬Έμμ΄, μ μ, λΆμΈ, λ°°μ΄, κ°μ²΄) λ° μ μ½ μ‘°κ±΄(μ: νμ νλ, κΈ°λ³Έκ°)μ ν¬ν¨νμ¬ λ©μμ§ κ΅¬μ‘°μ λν 곡μμ μΈ κΈ°κ³ νλ κ°λ₯ μ μμ λλ€.
- μ€ν€λ§ λ μ§μ€νΈλ¦¬: μ΄λ¬ν μ€ν€λ§λ₯Ό μ μ₯, κ΄λ¦¬ λ° μ 곡νλ μ€μ μ§μ€μ μ μ₯μμ λλ€. νλ‘λμλ μ€ν€λ§λ₯Ό λ±λ‘νκ³ μ»¨μλ¨Έλ νΈνμ±μ 보μ₯νκΈ° μν΄ μ€ν€λ§λ₯Ό κ²μν©λλ€.
- μ§λ ¬ν/μμ§λ ¬ν: μ μλ μ€ν€λ§λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μ μ‘μ μν΄ λ°μ΄νΈ μ€νΈλ¦ΌμΌλ‘ μ§λ ¬ννκ³ μμ μ κ°μ²΄λ‘ λ€μ μμ§λ ¬ννλ λΌμ΄λΈλ¬λ¦¬ λλ λ―Έλ€μ¨μ΄μ λλ€. μ΄λ¬ν νλ‘μΈμ€λ λ³Έμ§μ μΌλ‘ μ€ν€λ§μ λν΄ λ°μ΄ν°λ₯Ό κ²μ¦ν©λλ€.
λͺ©νλ λ°μ΄ν° μ ν¨μ± κ²μ¦μ λΆλ΄μ λ°νμμμ μ»΄νμΌ νμ λλ μ΄κΈ° κ°λ° λ¨κ³λ‘ μ΄λμμΌ μ€λ₯λ₯Ό λ μ½κ² λ°κ²¬νκ³ νλ‘λμ μ λλ¬νλ κ²μ λ°©μ§νλ κ²μ λλ€.
νμ -μΈμ΄ν λ©μμ§ νμ μ£Όμ μ΄μ
νμ -μΈμ΄ν λ©μμ§ νλ₯Ό μ±ννλ©΄ μ΄λ²€νΈ-κΈ°λ° μμ€ν μ λ€μν μ΄μ μ΄ μμ΅λλ€.
- ν₯μλ μμ μ±: λ°μ΄ν° κ³μ½μ μ μ©νμ¬ νμ μμ μ±μ μλͺ»λμκ±°λ μμμΉ λͺ»ν λ©μμ§ νμ΄λ‘λλ‘ μΈν΄ λ°μνλ λ°νμ μ€λ₯μ κ°λ₯μ±μ ν¬κ² μ€μ λλ€. 컨μλ¨Έλ μμ νλ λ°μ΄ν°λ₯Ό μ λ’°ν μ μμ΅λλ€.
- ν₯μλ μ μ§λ³΄μμ±: μ€ν€λ§ μ§νλ κ΄λ¦¬λλ νλ‘μΈμ€κ° λ©λλ€. μ€ν€λ§λ₯Ό λ³κ²½ν΄μΌ ν λ λͺ μμ μΌλ‘ μνλ©λλ€. 컨μλ¨Έλ νμμ λ°λΌ μ΄μ λλ μ΄ν νΈνμ±μ 보μ₯νλ©΄μ μ λ²μ μ μ€ν€λ§λ₯Ό μ²λ¦¬νλλ‘ μ λ°μ΄νΈν μ μμ΅λλ€.
- λ λΉ λ₯Έ κ°λ° μ£ΌκΈ°: κ°λ°μλ λ©μμ§ κ΅¬μ‘°μ λν λͺ νν μ μλ₯Ό ν΅ν΄ μΆμΈ‘κ³Ό λͺ¨νΈμ±μ μ€μ λλ€. λꡬλ μ’ μ’ μ€ν€λ§λ₯Ό κΈ°λ°μΌλ‘ μ½λ(μ: λ°μ΄ν° ν΄λμ€, μΈν°νμ΄μ€)λ₯Ό μμ±νμ¬ ν΅ν©μ κ°μννκ³ μμ©κ΅¬ μ½λλ₯Ό μ€μΌ μ μμ΅λλ€.
- κ°μνλ λλ²κΉ : λ¬Έμ κ° λ°μνλ©΄ νμ μμ μ±μ΄ κ·Όλ³Έ μμΈμ λ 빨리 μ°Ύμλ΄λ λ° λμμ΄ λ©λλ€. λΆμΌμΉλ μ’ μ’ κ°λ° λλ ν μ€νΈ λ¨κ³ μ΄κΈ°μ λ°κ²¬λκ±°λ μ§λ ¬ν/μμ§λ ¬ν νλ‘μΈμ€μ μν΄ λͺ ννκ² νμλ©λλ€.
- 볡μ‘ν EDA ν¨ν΄ μ§μ: μ΄λ²€νΈ μμ± λ° CQRS(λͺ λ Ή 쿼리 μ± μ λΆλ¦¬)μ κ°μ ν¨ν΄μ μ΄λ²€νΈ μνμ€λ₯Ό μμ μ μΌλ‘ μ μ₯, μ¬μ λ° μ²λ¦¬νλ κΈ°λ₯μ ν¬κ² μμ‘΄ν©λλ€. νμ μμ μ±μ μ΄λ¬ν μ΄λ²€νΈ μ€νΈλ¦Όμ 무결μ±μ 보μ₯νλ λ° λ§€μ° μ€μν©λλ€.
μΌλ°μ μΈ μ΄λ²€νΈ-κΈ°λ° μν€ν μ² ν¨ν΄ λ° νμ μμ μ±
νμ -μΈμ΄ν λ©μμ§ νλ λ€μν κ³ κΈ EDA ν¨ν΄μ ν¨κ³Όμ μΌλ‘ ꡬννκΈ° μν ν λμ λλ€. λͺ κ°μ§λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
1. κ²μ-ꡬλ (Pub/Sub)
Pub/Sub ν¨ν΄μμ κ²μμλ ꡬλ μκ° λꡬμΈμ§ μμ§ λͺ»ν μ± λ©μμ§λ₯Ό ν ν½μΌλ‘ 보λ λλ€. ꡬλ μλ νΉμ ν ν½μ κ΄μ¬μ νλͺ νκ³ κ²μλ λ©μμ§λ₯Ό λ°μ΅λλ€. λ©μμ§ νλ μ’ μ’ ν ν½ λλ κ΅νμ ν΅ν΄ μ΄λ₯Ό ꡬνν©λλ€.
νμ μμ μ± μν₯: μλΉμ€κ° `OrderCreated`, `UserLoggedIn`κ³Ό κ°μ μ΄λ²€νΈλ₯Ό ν ν½μ κ²μν λ νμ μμ μ±μ ν΄λΉ ν ν½μμ μλΉνλ λͺ¨λ ꡬλ μκ° μΌκ΄λ κ΅¬μ‘°λ‘ μ΄λ¬ν μ΄λ²€νΈλ₯Ό μμνλλ‘ λ³΄μ₯ν©λλ€. μλ₯Ό λ€μ΄, `OrderCreated` μ΄λ²€νΈλ νμ `orderId`(λ¬Έμμ΄), `customerId`(λ¬Έμμ΄), `timestamp`(long) λ° `items`(`productId` λ° `quantity`κ° μλ κ°μ²΄ λ°°μ΄)λ₯Ό ν¬ν¨ν μ μμ΅λλ€. κ²μμκ° λμ€μ `customerId`λ₯Ό λ¬Έμμ΄μμ μ μλ‘ λ³κ²½νλ©΄ μ€ν€λ§ λ μ§μ€νΈλ¦¬ λ° μ§λ ¬ν/μμ§λ ¬ν νλ‘μΈμ€κ° μ΄ λΉνΈνμ±μ νλκ·Ένμ¬ μλͺ»λ λ°μ΄ν°κ° μ νλλ κ²μ λ°©μ§ν©λλ€.
κΈλ‘λ² μμ : κΈλ‘λ² μ μ μκ±°λ νλ«νΌμ `ProductPublished` μ΄λ²€νΈκ° μμ μ μμ΅λλ€. μ λ½, μμμ, λΆλ―Έμ κ°μ λ€λ₯Έ μ§μ μλΉμ€λ μ΄ μ΄λ²€νΈμ κ°μ ν©λλ€. νμ μμ μ±μ κ° μ§μμ μ²λ¦¬ λ Όλ¦¬κ° λ€λ₯΄λλΌλ λͺ¨λ μ§μμ΄ `productId`, `name`, `description` λ° `price`(μ μλ ν΅ν νμ λλ λ³λμ ν΅ν νλ ν¬ν¨)μ κ°μ μΌκ΄λ νλλ‘ `ProductPublished` μ΄λ²€νΈλ₯Ό μμ νλλ‘ λ³΄μ₯ν©λλ€.
2. μ΄λ²€νΈ μμ±
μ΄λ²€νΈ μμ±μ μ ν리μΌμ΄μ μνμ λν λͺ¨λ λ³κ²½ μ¬νμ΄ λ³κ²½ λΆκ°λ₯ν μ΄λ²€νΈ μνμ€λ‘ μ μ₯λλ μν€ν μ² ν¨ν΄μ λλ€. μ ν리μΌμ΄μ μ νμ¬ μνλ μ΄λ¬ν μ΄λ²€νΈλ₯Ό μ¬μνμ¬ νμλ©λλ€. λ©μμ§ νλ μ΄λ²€νΈ μ μ₯μ λλ μ΄λ²€νΈ μ μ₯μλ‘μ λκ΄ μν μ ν μ μμ΅λλ€.
νμ μμ μ± μν₯: μ 체 μμ€ν μνμ 무결μ±μ μ΄λ²€νΈ λ‘κ·Έμ μ νμ±κ³Ό μΌκ΄μ±μ λ¬λ € μμ΅λλ€. μ¬κΈ°μ νμ μμ μ±μ ννμ μ¬μ§κ° μμ΅λλ€. μ΄λ²€νΈ μ€ν€λ§κ° μ§ννλ κ²½μ° κΈ°λ‘ λ°μ΄ν° μ²λ¦¬ μ λ΅μ΄ λ§λ ¨λμ΄μΌ ν©λλ€(μ: μ€ν€λ§ λ²μ κ΄λ¦¬, μ΄λ²€νΈ λ³ν). νμ μμ μ±μ΄ μμΌλ©΄ μ΄λ²€νΈλ₯Ό μ¬μνλ©΄ μνκ° μμλμ΄ μμ€ν μ΄ λΆμμ ν΄μ§ μ μμ΅λλ€.
κΈλ‘λ² μμ : κΈμ΅ κΈ°κ΄μ κ±°λ λ΄μμ μ΄λ²€νΈ μμ±μ μ¬μ©ν μ μμ΅λλ€. κ° κ±°λ(μ κΈ, μΈμΆ, μ΄μ²΄)λ μ΄λ²€νΈμ λλ€. νμ μμ μ±μ κ³Όκ±° κ±°λ κΈ°λ‘μ΄ μΌκ΄λκ² κ΅¬μ‘°νλλλ‘ λ³΄μ₯νμ¬ λ€μν κΈλ‘λ² μ§μ λλ κ·μ κΈ°κ΄μμ μ νν κ°μ¬, μ‘°μ λ° μν μ¬κ΅¬μ±μ κ°λ₯νκ² ν©λλ€.
3. λͺ λ Ή 쿼리 μ± μ λΆλ¦¬ (CQRS)
CQRSλ μ 보 μ λ°μ΄νΈ(λͺ λ Ή)μ μ¬μ©λλ λͺ¨λΈκ³Ό μ 보 μ½κΈ°(쿼리)μ μ¬μ©λλ λͺ¨λΈμ λΆλ¦¬ν©λλ€. μ’ μ’ λͺ λ Ήμ μ½κΈ° λͺ¨λΈμ μ λ°μ΄νΈνλ λ° μ¬μ©λλ μ΄λ²€νΈλ₯Ό λ°μμν΅λλ€. λ©μμ§ νλ μ΄λ¬ν λͺ¨λΈ κ°μ λͺ λ Ήκ³Ό μ΄λ²€νΈλ₯Ό μ ννλ λ° μμ£Ό μ¬μ©λ©λλ€.
νμ μμ μ± μν₯: μ°κΈ° μΈ‘μΌλ‘ μ μ‘λλ λͺ λ Ήκ³Ό μ°κΈ° μΈ‘μμ κ²μλ μ΄λ²€νΈλ μ격ν μ€ν€λ§λ₯Ό μ€μν΄μΌ ν©λλ€. λ§μ°¬κ°μ§λ‘ μ½κΈ° λͺ¨λΈμ μ λ°μ΄νΈνλ λ° μ¬μ©λλ μ΄λ²€νΈμλ μΌκ΄λ νμμ΄ νμν©λλ€. νμ μμ μ±μ λͺ λ Ή μ²λ¦¬κΈ°κ° λ€μ΄μ€λ λͺ λ Ήμ μ¬λ°λ₯΄κ² ν΄μνκ³ μμ±λ μ΄λ²€νΈλ₯Ό λ€λ₯Έ μλΉμ€μ μ½κΈ° λͺ¨λΈ νλ‘μ ν° λͺ¨λμμ μμ μ μΌλ‘ μ²λ¦¬ν μ μλλ‘ λ³΄μ₯ν©λλ€.
κΈλ‘λ² μμ : λ¬Όλ₯ νμ¬μμ μ μ κ΄λ¦¬μ CQRSλ₯Ό μ¬μ©ν μ μμ΅λλ€. `CreateShipmentCommand`κ° μ°κΈ° μΈ‘μΌλ‘ μ μ‘λ©λλ€. μ±κ³΅μ μΌλ‘ μμ±λλ©΄ `ShipmentCreatedEvent`κ° κ²μλ©λλ€. κ·Έλ° λ€μ μ½κΈ° λͺ¨λΈ μλΉμ(μ: μΆμ λμ보λ, λ°°μ‘ μλ¦Ό)λ μ΄ μ΄λ²€νΈλ₯Ό μ²λ¦¬ν©λλ€. νμ μμ μ±μ `ShipmentCreatedEvent`μ λͺ λ Ήμ μΆμ² λλ μ½κΈ° λͺ¨λΈ μλΉμ€μ μμΉμ κ΄κ³μμ΄ μμΈ‘ κ°λ₯ν νμμΌλ‘ `shipmentId`, `originAddress`, `destinationAddress`, `estimatedDeliveryDate` λ° `status`μ κ°μ νμν λͺ¨λ μΈλΆ μ λ³΄κ° ν¬ν¨λλλ‘ λ³΄μ₯ν©λλ€.
νμ μμ μ± κ΅¬ν: λꡬ λ° κΈ°μ
λ©μμ§ νμμ νμ μμ μ±μ λ¬μ±νλ €λ©΄ μΌλ°μ μΌλ‘ μ§λ ¬ν νμ, μ€ν€λ§ μ μ μΈμ΄ λ° μ λ¬Έ λꡬμ μ‘°ν©μ΄ νμν©λλ€.
1. μ§λ ¬ν νμ
μ§λ ¬ν νμμ μ νμ μ€μν μν μ ν©λλ€. μ€ν€λ§ μ μ© κΈ°λ₯μ΄ μλ μΈκΈ° μλ μ΅μ μ λ€μκ³Ό κ°μ΅λλ€.
- Apache Avro: JSONμΌλ‘ μμ±λ μ€ν€λ§λ₯Ό μ¬μ©νλ λ°μ΄ν° μ§λ ¬ν μμ€ν μ λλ€. μ»΄ν©νΈνκ³ λΉ λ₯΄λ©° μ€ν€λ§ μ§νλ₯Ό μ§μν©λλ€.
- Protocol Buffers (Protobuf): ꡬ쑰νλ λ°μ΄ν°λ₯Ό μ§λ ¬ννκΈ° μν μΈμ΄ μ€λ¦½μ , νλ«νΌ μ€λ¦½μ , νμ₯ κ°λ₯ν λ©μ»€λμ¦μ λλ€. ν¨μ¨μ μ΄κ³ λ리 μ±νλμμ΅λλ€.
- JSON Schema: JSON λ¬Έμλ₯Ό μ£Όμ μ²λ¦¬νκ³ μ ν¨μ±μ κ²μ¬ν μ μλ μ΄νμ λλ€. JSON μ체λ μ€ν€λ§κ° μμ§λ§ JSON Schemaλ JSON λ°μ΄ν°μ λν μ€ν€λ§λ₯Ό μ μνλ λ°©λ²μ μ 곡ν©λλ€.
- Thrift: Facebookμμ κ°λ°ν Thriftλ λ°μ΄ν° μ νκ³Ό μλΉμ€λ₯Ό μ μνλ λ° μ¬μ©λλ μΈν°νμ΄μ€ μ μ μΈμ΄(IDL)μ λλ€.
μ΄λ¬ν νμμ μ μ ν λΌμ΄λΈλ¬λ¦¬μ ν¨κ» μ¬μ©νλ©΄ μ μλ μ€ν€λ§μ λ°λΌ λ°μ΄ν°κ° μ§λ ¬ν λ° μμ§λ ¬νλλλ‘ λ³΄μ₯νμ¬ νλ‘μΈμ€ μ€μ μ ν λΆμΌμΉλ₯Ό μ‘μλ λλ€.
2. μ€ν€λ§ λ μ§μ€νΈλ¦¬
μ€ν€λ§ λ μ§μ€νΈλ¦¬λ λ©μμ§ μ νμ λν μ€ν€λ§λ₯Ό μ μ₯νκ³ κ΄λ¦¬νλ μ€μ κ΅¬μ± μμμ λλ€. μΈκΈ° μλ μ€ν€λ§ λ μ§μ€νΈλ¦¬λ λ€μκ³Ό κ°μ΅λλ€.
- Confluent Schema Registry: Apache Kafkaμ κ²½μ° Avro, JSON Schema λ° Protobufλ₯Ό μ§μνλ μ¬μ€μμ νμ€μ λλ€.
- AWS Glue Schema Registry: Avro, JSON Schema λ° Protobufλ₯Ό μ§μνκ³ Kinesis λ° MSKμ κ°μ AWS μλΉμ€μ μ ν΅ν©λλ μμ κ΄λ¦¬ν μ€ν€λ§ λ μ§μ€νΈλ¦¬μ λλ€.
- Google Cloud Schema Registry: Google Cloudμ Pub/Sub μ νμ μΌλΆλ‘ Pub/Sub ν ν½μ λν μ€ν€λ§ κ΄λ¦¬λ₯Ό νμ©ν©λλ€.
μ€ν€λ§ λ μ§μ€νΈλ¦¬λ λ€μμ κ°λ₯νκ² ν©λλ€.
- μ€ν€λ§ λ²μ κ΄λ¦¬: μ€ν€λ§μ λ€μν λ²μ μ κ΄λ¦¬νμ¬ μ€ν€λ§ μ§νλ₯Ό μ μμ μΌλ‘ μ²λ¦¬νλ λ° μ€μν©λλ€.
- νΈνμ± κ²μ¬: μ€ν€λ§ μ λ°μ΄νΈκ° κΈ°μ‘΄ 컨μλ¨Έ λλ νλ‘λμλ₯Ό μμμν€μ§ μλλ‘ νΈνμ± κ·μΉ(μ: μ΄μ , μ΄ν, μ 체 νΈνμ±)μ μ μν©λλ€.
- μ€ν€λ§ κ²μ: 컨μλ¨Έλ νΉμ λ©μμ§μ μ°κ²°λ μ€ν€λ§λ₯Ό κ²μν μ μμ΅λλ€.
3. λ©μμ§ λΈλ‘컀μμ ν΅ν©
νμ μμ μ±μ ν¨κ³Όλ μ νν λ©μμ§ λΈλ‘컀μ μΌλ§λ μ ν΅ν©λλμ§μ λ°λΌ λ¬λΌμ§λλ€.
- Apache Kafka: μ’ μ’ Confluent Schema Registryμ ν¨κ» μ¬μ©λ©λλ€. Kafka 컨μλ¨Έ λ° νλ‘λμλ λ μ§μ€νΈλ¦¬μμ κ΄λ¦¬νλ μ€ν€λ§λ₯Ό μ¬μ©νμ¬ Avro λλ Protobuf μ§λ ¬νλ₯Ό μ¬μ©νλλ‘ κ΅¬μ±ν μ μμ΅λλ€.
- RabbitMQ: RabbitMQ μ체λ λ²μ© λ©μμ§ λΈλ‘컀μ΄μ§λ§ λ©μμ§λ₯Ό RabbitMQ νλ‘ λ³΄λ΄κΈ° μ μ Avro, Protobuf λλ JSON Schemaλ‘ μ§λ ¬ννλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ νμ μμ μ±μ μ μ©ν μ μμ΅λλ€. κ·Έλ° λ€μ 컨μλ¨Έλ μμ§λ ¬νλ₯Ό μν΄ λμΌν λΌμ΄λΈλ¬λ¦¬ λ° μ€ν€λ§ μ μλ₯Ό μ¬μ©ν©λλ€.
- Amazon SQS/SNS: RabbitMQμ μ μ¬νκ² SQS/SNSλ μ¬μ©μ μ§μ μ§λ ¬ν λ Όλ¦¬μ ν¨κ» μ¬μ©ν μ μμ΅λλ€. κ΄λ¦¬ν μ루μ μ κ²½μ° AWS Glue Schema Registryλ₯Ό Kinesisμ κ°μ μλΉμ€(κ·Έλ° λ€μ SQSλ‘ κ³΅κΈλ μ μμ) λλ μ€ν€λ§ μ ν¨μ± κ²μ¬λ₯Ό μ§μνλ μλΉμ€μ μ§μ ν΅ν©ν μ μμ΅λλ€.
- Google Cloud Pub/Sub: Pub/Sub ν ν½μ λν μ€ν€λ§ κ΄λ¦¬λ₯Ό μ§μνμ¬ Avro λλ Protocol Buffersλ₯Ό μ¬μ©νμ¬ μ€ν€λ§λ₯Ό μ μνκ³ μ μ©ν μ μμ΅λλ€.
νμ -μΈμ΄ν λ©μμ§ ν ꡬνμ μν λͺ¨λ² μ¬λ‘
νμ -μΈμ΄ν λ©μμ§ νμ μ΄μ μ κ·Ήλννλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμμμ€.
- λͺ νν λ©μμ§ κ³μ½ μ μ: λ©μμ§ μ€ν€λ§λ₯Ό κ³΅μ© APIλ‘ μ·¨κΈν©λλ€. μ² μ ν λ¬Έμννκ³ ν΄λΉ μ μμ λͺ¨λ κ΄λ ¨ νμ μ°Έμ¬μν΅λλ€.
- μ€ν€λ§ λ μ§μ€νΈλ¦¬ μ¬μ©: μ€ν€λ§ κ΄λ¦¬λ₯Ό μ€μ μ§μ€νν©λλ€. μ΄λ λ²μ κ΄λ¦¬, νΈνμ± λ° κ±°λ²λμ€μ λ§€μ° μ€μν©λλ€.
- μ μ ν μ§λ ¬ν νμ μ ν: Avro, Protobuf λλ κΈ°ν νμμ μ νν λ μ±λ₯, μ€ν€λ§ μ§ν κΈ°λ₯, μμ½μμ€ν μ§μ λ° λ°μ΄ν° ν¬κΈ°μ κ°μ μμλ₯Ό κ³ λ €νμμμ€.
- μ€ν€λ§ λ²μ κ΄λ¦¬λ₯Ό μ λ΅μ μΌλ‘ ꡬν: μ€ν€λ§ μ§νμ λν λͺ νν κ·μΉμ μ μν©λλ€. μ΄μ , μ΄ν λ° μ 체 νΈνμ±μ μ°¨μ΄μ μ μ΄ν΄νκ³ μμ€ν μ μꡬ μ¬νμ κ°μ₯ μ ν©ν μ λ΅μ μ ννμμμ€.
- μ€ν€λ§ μ ν¨μ± κ²μ¬ μλν: CI/CD νμ΄νλΌμΈμ μ€ν€λ§ μ ν¨μ± κ²μ¬λ₯Ό ν΅ν©νμ¬ μ€λ₯λ₯Ό μ‘°κΈ°μ μ‘μλ λλ€.
- μ€ν€λ§μμ μ½λ μμ±: λꡬλ₯Ό νμ©νμ¬ μ€ν€λ§μμ νλ‘κ·Έλλ° μΈμ΄λ‘ λ°μ΄ν° ν΄λμ€ λλ μΈν°νμ΄μ€λ₯Ό μλμΌλ‘ μμ±ν©λλ€. μ΄λ κ² νλ©΄ μ ν리μΌμ΄μ μ½λκ° νμ λ©μμ§ κ³μ½κ³Ό λκΈ°νλ©λλ€.
- μ€ν€λ§ μ§νλ₯Ό μ μ€νκ² μ²λ¦¬: μ€ν€λ§λ₯Ό μ§νμν¬ λ κ°λ₯νλ©΄ μ΄μ νΈνμ±μ μ°μ μνμ¬ κΈ°μ‘΄ 컨μλ¨Έμ μ€λ¨μ λ°©μ§ν©λλ€. μ΄μ νΈνμ±μ΄ λΆκ°λ₯ν κ²½μ° λ¨κ³μ λ‘€μμμ κ³ννκ³ λ³κ²½ μ¬νμ ν¨κ³Όμ μΌλ‘ μ λ¬ν©λλ€.
- μ€ν€λ§ μ¬μ©λ λͺ¨λν°λ§: μ΄λ€ μ€ν€λ§κ° λꡬμ μν΄ μ¬μ©λκ³ μλμ§, νΈνμ± μνλ₯Ό μΆμ ν©λλ€. μ΄λ μ μ¬μ μΈ λ¬Έμ λ₯Ό μλ³νκ³ λ§μ΄κ·Έλ μ΄μ μ κ³ννλ λ° λμμ΄ λ©λλ€.
- ν κ΅μ‘: λ©μμ§ νλ₯Ό μ¬μ©νλ λͺ¨λ κ°λ°μκ° νμ μμ μ±, μ€ν€λ§ κ΄λ¦¬ λ° μ νν λꡬμ μ€μμ±μ μ΄ν΄νλμ§ νμΈν©λλ€.
μ¬λ‘ μ°κ΅¬ μ€λν«: κΈλ‘λ² μ μ μκ±°λ μ£Όλ¬Έ μ²λ¦¬
λ€μν λλ₯μμ μ΄μλλ μΉ΄νλ‘κ·Έ κ΄λ¦¬, μ£Όλ¬Έ μ²λ¦¬, μ¬κ³ λ° λ°°μ‘μ μν λ§μ΄ν¬λ‘μλΉμ€κ° μλ κΈλ‘λ² μ μ μκ±°λ νμ¬λ₯Ό μμν΄ λ³΄μμμ€. μ΄λ¬ν μλΉμ€λ Kafka κΈ°λ° λ©μμ§ νλ₯Ό ν΅ν΄ ν΅μ ν©λλ€.
νμ μμ μ±μ΄ μλ μλ리μ€: μ£Όλ¬Έ μ²λ¦¬ μλΉμ€λ `order_id`(λ¬Έμμ΄), `customer_id`(λ¬Έμμ΄) λ° `items`(`product_id` λ° `quantity`κ° μλ κ°μ²΄ λ°°μ΄)κ° μλ `OrderPlaced` μ΄λ²€νΈλ₯Ό μμν©λλ€. μΉ΄νλ‘κ·Έ μλΉμ€ νμ΄ μλλ¬ `order_id`κ° μ μλ‘ μ μ‘λλ μ λ°μ΄νΈλ₯Ό λ°°ν¬νλ©΄ μ£Όλ¬Έ μ²λ¦¬ μλΉμ€κ° μΆ©λνκ±°λ μ£Όλ¬Έμ μλͺ» μ²λ¦¬νμ¬ κ³ κ° λΆλ§κ³Ό μμ΅ μμ€μ΄ λ°μν κ°λ₯μ±μ΄ λμ΅λλ€. λΆμ° μλΉμ€μμ μ΄λ₯Ό λλ²κΉ νλ κ²μ μ λͺ½μ΄ λ μ μμ΅λλ€.
νμ μμ μ±μ΄ μλ μλλ¦¬μ€ (Avro λ° Confluent Schema Registry μ¬μ©):
- μ€ν€λ§ μ μ: `orderId`λ₯Ό `string`μΌλ‘, `customerId`λ₯Ό `string`μΌλ‘, `items`λ₯Ό `productId`(λ¬Έμμ΄) λ° `quantity`(μ μ)κ° μλ λ μ½λ λ°°μ΄λ‘ μ§μ νμ¬ Avroλ₯Ό μ¬μ©νμ¬ `OrderPlaced` μ΄λ²€νΈ μ€ν€λ§λ₯Ό μ μν©λλ€. μ΄ μ€ν€λ§λ Confluent Schema Registryμ λ±λ‘λ©λλ€.
- νλ‘λμ (μΉ΄νλ‘κ·Έ μλΉμ€): μΉ΄νλ‘κ·Έ μλΉμ€λ μ€ν€λ§ λ μ§μ€νΈλ¦¬λ₯Ό κ°λ¦¬ν€λ Avro μ§λ ¬ λ³νκΈ°λ₯Ό μ¬μ©νλλ‘ κ΅¬μ±λ©λλ€. `orderId`λ₯Ό μ μλ‘ λ³΄λ΄λ €κ³ μλνλ©΄ μ§λ ¬ λ³νκΈ°κ° λ±λ‘λ μ€ν€λ§λ₯Ό μ€μνμ§ μκΈ° λλ¬Έμ λ©μμ§λ₯Ό κ±°λΆν©λλ€. μ΄ μ€λ₯λ κ°λ° λλ ν μ€νΈ μ€μ μ¦μ λ°κ²¬λ©λλ€.
- 컨μλ¨Έ (μ£Όλ¬Έ μ²λ¦¬ μλΉμ€): μ£Όλ¬Έ μ²λ¦¬ μλΉμ€λ μ€ν€λ§ λ μ§μ€νΈλ¦¬μλ μ°κ²°λ Avro μμ§λ ¬ λ³νκΈ°λ₯Ό μ¬μ©ν©λλ€. νμ μ μλ ꡬ쑰μ μ νμ κ°μ§ κ²μ΄λΌλ κ²μ μκ³ `OrderPlaced` μ΄λ²€νΈλ₯Ό μμ μκ² μ²λ¦¬ν μ μμ΅λλ€.
- μ€ν€λ§ μ§ν: λμ€μ νμ¬λ `OrderPlaced` μ΄λ²€νΈμ μ νμ `discountCode`(λ¬Έμμ΄)λ₯Ό μΆκ°νκΈ°λ‘ κ²°μ ν©λλ€. λ μ§μ€νΈλ¦¬μμ μ€ν€λ§λ₯Ό μ λ°μ΄νΈνμ¬ `discountCode`λ₯Ό nullable λλ optionalλ‘ νμν©λλ€. μ΄ μ λ°μ΄νΈκ° μ΄μ λ²μ κ³Ό νΈνλλμ§ νμΈν©λλ€. μμ§ `discountCode`λ₯Ό μμνμ§ μλ κΈ°μ‘΄ 컨μλ¨Έλ λ¨μν 무μνκ³ μ΅μ λ²μ μ μΉ΄νλ‘κ·Έ μλΉμ€λ μ μ‘μ μμν μ μμ΅λλ€.
μ΄ μ²΄κ³μ μΈ μ κ·Ό λ°©μμ λ°μ΄ν° λ¬΄κ²°μ± λ¬Έμ λ₯Ό λ°©μ§νκ³ κ°λ° μλλ₯Ό λμ΄λ©° 볡μ‘ν μμ€ν μμ μμ νλ κΈλ‘λ² νμκ²λ μ 체 μμ€ν μ ν¨μ¬ λ κ°λ ₯νκ³ κ΄λ¦¬νκΈ° μ½κ² λ§λλλ€.
κ²°λ‘
νμ -μΈμ΄ν λ©μμ§ νλ λ¨μν μ¬μΉκ° μλλΌ νλμ μ΄κ³ νλ ₯μ μ΄λ©° νμ₯ κ°λ₯ν μ΄λ²€νΈ-κΈ°λ° μν€ν μ²λ₯Ό ꡬμΆνλ λ° νμμ μ λλ€. λ©μμ§ μ€ν€λ§λ₯Ό 곡μμ μΌλ‘ μ μνκ³ μ μ©ν¨μΌλ‘μ¨ λΆμ° μμ€ν μ κ΄΄λ‘νλ μ€μν μ’ λ₯μ μ€λ₯λ₯Ό μνν©λλ€. λ°μ΄ν° 무결μ±μ λν μμ κ°μ κ°λ°μμκ² λΆμ¬νκ³ κ°λ°μ κ°μννλ©° μ΄λ²€νΈ μμ± λ° CQRSμ κ°μ κ³ κΈ ν¨ν΄μ κΈ°λ°μ νμ±ν©λλ€.
μ‘°μ§μ΄ λ§μ΄ν¬λ‘μλΉμ€ λ° λΆμ° μμ€ν μ μ μ λ λ§μ΄ μ±νν¨μ λ°λΌ λ©μμ§ ν μΈνλΌμμ νμ μμ μ±μ μμ©νλ κ²μ μ λ΅μ ν¬μμ λλ€. λ³΄λ€ μμΈ‘ κ°λ₯ν μμ€ν , λ μ μ νλ‘λμ μ¬κ³ λ° λ³΄λ€ μμ°μ μΈ κ°λ° κ²½νμΌλ‘ μ΄μ΄μ§λλ€. κΈλ‘λ² νλ«νΌμ ꡬμΆνλ μ λ¬Έ λ§μ΄ν¬λ‘μλΉμ€λ₯Ό ꡬμΆνλ μ΄λ²€νΈ-κΈ°λ° ν΅μ μμ νμ μμ μ±μ μ°μ μνλ©΄ μμ μ±, μ μ§λ³΄μμ± λ° μ₯κΈ°μ μΈ μ±κ³΅μ λν λ°°λΉκΈμ λ°κ² λ©λλ€.